home *** CD-ROM | disk | FTP | other *** search
- ///--------------------------------------------------------------------------------------
- // Large Background.c
- //
- // By Vern Jensen, August 1995
- ///--------------------------------------------------------------------------------------
-
-
- #include <SWFPSReport.h>
- #include <SWIncludes.h>
- #include <SWGameUtils.h>
-
- #include "SWApplication.h"
- #include "Large Background.h"
-
-
-
- #define kDoubleSize true // doubles size of offscreen area
- #define kInterlacedMode true // turns Interlaced mode on/off
- #define kSyncToVBL false // sync SpriteWorld to VBL?
- #define kWorldRectInset 0 // make SpriteWorld smaller than window
- #define kMaxFPS 30 // set to 0 for unrestricted speed
-
- #define kNumSprites 30 // total number of sprites
- #define kMaxSpriteMoveDelta 10 // maximum speed of the sprites
- #define kScrollSpeed 8 // scrolling speed in pixels
-
-
- #define kLeftArrowKey 0x7B
- #define kRightArrowKey 0x7C
- #define kDownArrowKey 0x7D
- #define kUpArrowKey 0x7E
-
- #define kLeftKeyPad 0x56
- #define kRightKeyPad 0x58
- #define kDownKeyPad 0x54
- #define kUpKeyPad 0x5B
-
- #define kEscKey 0x35
-
-
-
- /***********/
- /* Globals */
- /***********/
-
- SpriteWorldPtr gSpriteWorldP;
- SpritePtr gSpriteArray[kNumSprites];
- Rect gOffscreenRect;
- PicHandle gBackPictH;
- WindowPtr gWindowP;
-
-
- struct moveKeys
- {
- Boolean up;
- Boolean right;
- Boolean down;
- Boolean left;
- } keys;
-
-
-
-
- ///--------------------------------------------------------------------------------------
- // Main
- ///--------------------------------------------------------------------------------------
-
- void main( void )
- {
- Initialize(kNumberOfMoreMastersCalls);
-
- if (SWHasSystem7())
- {
- AllowKeyUpEvents();
- SetCursor(*GetCursor(watchCursor));
-
- CreateSpriteWorld();
- CreateSprites();
-
- SetUpAnimation();
- RunAnimation();
- ShutDown();
-
- RestoreEventMask();
- }
- else
- {
- CantRunOnThisMachine();
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSpriteWorld
- ///--------------------------------------------------------------------------------------
-
-
- void CreateSpriteWorld( void )
- {
- RgnHandle mBarUpdateRgn;
- Rect windRect, worldRect;
- OSErr err;
-
- gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
-
- if (gWindowP != NULL)
- {
- // Center window in screen
- windRect = gWindowP->portRect;
- CenterRect(&windRect, &qd.screenBits.bounds);
- MoveWindow(gWindowP, windRect.left, windRect.top, false);
-
- ShowWindow(gWindowP);
- SetPort(gWindowP);
- mBarUpdateRgn = HideMenuBar(gWindowP); // Must be done *after* showing window!
- EraseRgn(mBarUpdateRgn);
-
- if (kInterlacedMode)
- PaintRect(&gWindowP->portRect); // Black out window for Interlaced mode
- }
- else
- CantFindResource();
-
-
- err = SWEnterSpriteWorld();
- FatalError(err);
-
-
- if ( GetDepthFromWindow(gWindowP) <= 2 )
- gBackPictH = GetPicture(129); // B&W pict
- else
- gBackPictH = GetPicture(128); // Color pict
-
- if (gBackPictH == nil)
- {
- SysBeep( 10 );
- ExitToShell();
- }
-
- gOffscreenRect = (**(gBackPictH)).picFrame;
-
- if (kDoubleSize)
- {
- gOffscreenRect.right *= 2;
- gOffscreenRect.bottom *= 2;
- }
-
-
- worldRect = gWindowP->portRect;
- InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
-
-
- // Create the SpriteWorld
- err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP,
- &worldRect, &gOffscreenRect);
- FatalError(err);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSprites
- ///--------------------------------------------------------------------------------------
-
- void CreateSprites( void )
- {
- SpriteLayerPtr spriteLayerP;
- SpritePtr simpleSpriteP;
- short spriteNum;
- OSErr err;
-
-
- // Create the sprite layer
- err = SWCreateSpriteLayer(&spriteLayerP);
- FatalError(err);
-
- // Create the first sprite
- err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &gSpriteArray[0], NULL,
- 128, 1, kFatMask);
- FatalError(err);
-
- SWCompileSprite(gSpriteArray[0]);
-
- // clone the rest of the sprites off the first one
- for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
- {
- err = SWCloneSprite(gSpriteArray[0], &gSpriteArray[spriteNum], NULL);
- FatalError(err);
- }
-
-
- // Set up the sprites in random locations with random deltas
- for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
- {
- simpleSpriteP = gSpriteArray[spriteNum];
-
- SWSetSpriteMoveBounds(simpleSpriteP, &gOffscreenRect);
- SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
-
- SWSetSpriteLocation(simpleSpriteP,
- GetRandom(0, gOffscreenRect.right),
- GetRandom(0, gOffscreenRect.bottom) );
-
- SWSetSpriteMoveDelta(simpleSpriteP,
- GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta),
- GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta));
-
-
- if (gSpriteWorldP->pixelDepth == 8) // 256 colors
- {
- if (kInterlacedMode)
- SWSetSpriteDrawProc(simpleSpriteP, BP8BitInterlacedMaskDrawProc);
- else
- SWSetSpriteDrawProc(simpleSpriteP, CompiledSprite8BitDrawProc);
- }
- else // Not 256 colors
- {
- #if !SW_PPC // Use interlaced drawProcs unless in B&W, where interlacing is ugly
- if (kInterlacedMode && gSpriteWorldP->pixelDepth != 1)
- SWSetSpriteDrawProc(simpleSpriteP, BPAllBitInterlacedMaskDrawProc);
- else
- SWSetSpriteDrawProc(simpleSpriteP, BlitPixieAllBitMaskDrawProc);
- #endif
- }
- }
-
-
- // add the sprites to the layer
- for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
- SWAddSprite(spriteLayerP, gSpriteArray[spriteNum]);
-
- // add the layer to the world
- SWAddSpriteLayer(gSpriteWorldP, spriteLayerP);
-
-
- // Lock the sprite world
- SWLockSpriteWorld(gSpriteWorldP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SetUpAnimation
- ///--------------------------------------------------------------------------------------
-
- void SetUpAnimation( void )
- {
- SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
- SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
-
- SWSetScrollingWorldMoveBounds(gSpriteWorldP, &gSpriteWorldP->backRect);
- SWSetScrollingWorldMoveProc(gSpriteWorldP, KeyScrollRectMoveProc, NULL);
- // SWSetScrollingWorldMoveProc(gSpriteWorldP, AutoScrollMoveProc, NULL);
-
-
- if (gSpriteWorldP->pixelDepth == 8) // 256 Colors
- {
- if (kInterlacedMode)
- {
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BP8BitInterlacedRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BP8BitInterlacedRectDrawProc);
- }
- else
- {
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixie8BitRectDrawProc);
- }
- }
- else // Not 256 Colors
- {
- #if !SW_PPC
- // Use interlaced drawProcs unless in B&W, where interlacing is ugly
- if (kInterlacedMode && gSpriteWorldP->pixelDepth != 1)
- {
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BPAllBitInterlacedRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BPAllBitInterlacedRectDrawProc);
- }
- else
- {
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixieAllBitRectDrawProc);
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BlitPixieAllBitRectDrawProc);
- }
- #endif
- }
-
-
- ForeColor(blackColor);
- BackColor(whiteColor);
-
- // Draw background
- SWSetPortToBackground(gSpriteWorldP);
- DrawPicture(gBackPictH, &gOffscreenRect);
-
- SetCursor(&qd.arrow);
- HideCursor();
-
- SWUpdateScrollingSpriteWorld(gSpriteWorldP, true);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // RunAnimation
- ///--------------------------------------------------------------------------------------
-
-
- void RunAnimation( void )
- {
- unsigned long frames;
-
- frames = 0;
- StartTimer();
-
- while (!Button())
- {
- SWProcessScrollingSpriteWorld(gSpriteWorldP);
- SWAnimateScrollingSpriteWorld(gSpriteWorldP);
-
- if (gSpriteWorldP->frameHasOccured)
- frames++;
- }
-
- ShowMenuBar(gWindowP);
- ShowResults(frames);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // ShutDown (clean up and dispose of the SpriteWorld)
- ///--------------------------------------------------------------------------------------
-
-
- void ShutDown( void )
- {
- SWUnlockSpriteWorld(gSpriteWorldP);
- SWDisposeSpriteWorld(gSpriteWorldP);
- SWExitSpriteWorld();
-
- FlushEvents(everyEvent, 0);
- ShowCursor();
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BallSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
-
- void BallSpriteMoveProc(SpritePtr ballSpriteP)
- {
- SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
-
- // SWBounceSprite(ballSpriteP);
- SWWrapSprite(ballSpriteP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // KeyScrollRectMoveProc
- ///--------------------------------------------------------------------------------------
-
-
- void KeyScrollRectMoveProc(
- SpriteWorldPtr spriteWorldP,
- SpritePtr followSpriteP)
- {
- UpdateKeys();
-
- spriteWorldP->vertScrollDelta = (keys.down - keys.up) * kScrollSpeed;
- spriteWorldP->horizScrollDelta = (keys.right - keys.left) * kScrollSpeed;
- }
-
-
- ///--------------------------------------------------------------------------------------
- // AutoScrollMoveProc - optional scrolling move proc
- ///--------------------------------------------------------------------------------------
-
-
- void AutoScrollMoveProc(
- SpriteWorldPtr spriteWorldP,
- SpritePtr followSpriteP)
- {
- if (!spriteWorldP->horizScrollDelta && !spriteWorldP->vertScrollDelta)
- {
- spriteWorldP->horizScrollDelta = kScrollSpeed - 1;
- spriteWorldP->vertScrollDelta = kScrollSpeed;
- }
-
- if (spriteWorldP->visScrollRect.bottom + spriteWorldP->vertScrollDelta >
- spriteWorldP->scrollRectMoveBounds.bottom ||
- spriteWorldP->visScrollRect.top + spriteWorldP->vertScrollDelta <
- spriteWorldP->scrollRectMoveBounds.top)
- {
- spriteWorldP->vertScrollDelta *= -1;
- }
-
- if (spriteWorldP->visScrollRect.right + spriteWorldP->horizScrollDelta >
- spriteWorldP->scrollRectMoveBounds.right ||
- spriteWorldP->visScrollRect.left + spriteWorldP->horizScrollDelta <
- spriteWorldP->scrollRectMoveBounds.left)
- {
- spriteWorldP->horizScrollDelta *= -1;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // UpdateKeys (Put the latest key values in the keys structure)
- ///--------------------------------------------------------------------------------------
-
-
- void UpdateKeys( void )
- {
- EventRecord event;
- short theKey;
- Boolean isDown;
-
- while ( GetOSEvent( (keyUpMask | keyDownMask), &event ) )
- {
- theKey = (event.message & keyCodeMask) >> 8;
- isDown = (event.what != keyUp);
-
- if ( (theKey == kLeftArrowKey) || (theKey == kLeftKeyPad) )
- keys.left = isDown;
- else if ( (theKey == kRightArrowKey) || (theKey == kRightKeyPad) )
- keys.right = isDown;
- else if ( (theKey == kDownArrowKey) || (theKey == kDownKeyPad) )
- keys.down = isDown;
- else if ( (theKey == kUpArrowKey) || (theKey == kUpKeyPad) )
- keys.up = isDown;
- }
- }
-